home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
TypeMatcher.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-23
|
4KB
|
206 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "TypeMatcher.h"
#include "Class.h"
#include "String.h"
#include "Data.h"
#include "CLib.h"
#include "OrdColl.h"
const char *cMagic= "@!OIO";
Symbol cDocCreatorUndef("__UNKNOWN__"),
cDocTypeUndef("UNDEF"),
cDocTypeAscii("ASCII"),
cDocTypeET("ET++OIO"),
cDocTypeCPlusPlus("C++"),
cDocTypeC("C"),
cDocTypeCHeader("CHEADER"),
cDocTypeDirectory("SYSDIRECTORY"),
cDocTypeSpecial("SYSSPECIAL");
//---- TypeMatcher -------------------------------------------------------------
NewMetaImpl(TypeMatcher,Object, (T(type), TS(extension), TS(tag), TB(ascii),
TP(matchers)));
OrdCollection *TypeMatcher::matchers;
bool TypeMatcher::sorted;
void TypeMatcher::AddMatcher(TypeMatcher *ftm)
{
if (ftm) {
if (matchers == 0)
matchers= new OrdCollection;
matchers->Add(ftm);
sorted= FALSE;
}
}
TypeMatcher::TypeMatcher(Symbol t, char *ext, char *tg, bool ia, int prio)
{
type= t;
creator= cDocCreatorUndef;
isCCode= FALSE;
isETFormat= FALSE;
extension= ext ? strsave(ext) : 0;
tag= tg ? strsave(tg) : 0;
ascii= ia;
priority= prio;
AddMatcher(this);
}
TypeMatcher::~TypeMatcher()
{
SafeDelete(extension);
SafeDelete(tag);
if (matchers) {
matchers->RemovePtr(this);
if (matchers->Size() == 0)
SafeDelete(matchers);
}
}
bool TypeMatcher::MatchPathName(char *pathname, int)
{
char *s= strrchr(pathname, '.');
if (s) {
s++;
if (*s)
return MatchExtension(s);
}
return FALSE;
}
bool TypeMatcher::MatchExtension(char *ext)
{
return extension && (*ext == *extension) && (strcmp(ext, extension) == 0);
}
bool TypeMatcher::MatchNameAndContents(char*, char *buf, int len)
{
return MatchContents(buf, len);
}
bool TypeMatcher::MatchContents(char *bp, int len)
{
if (tag) {
int taglen= strlen(tag);
if (len >= taglen && *bp == *tag && strncmp(bp, tag, taglen) == 0)
return TRUE;
}
return FALSE;
}
TypeMatcher *TypeMatcher::MatchByName(char *bp, int len)
{
if (!sorted) {
matchers->Sort();
sorted= TRUE;
}
Iter next(matchers);
TypeMatcher *m;
while (m= (TypeMatcher*) next())
if (m->MatchPathName(bp, len))
return m;
return 0;
}
const int cContentsSize= 1024;
TypeMatcher *TypeMatcher::MatchByContents(char *name)
{
int namelen= strlen(name);
char buf[cContentsSize+1];
int fd= CLib::Open(name, 0);
if (fd < 0)
return 0;
int l= CLib::Read(fd, buf, cContentsSize);
CLib::Close(fd);
if (l <= 0)
return 0;
buf[l]= '\0';
if (!sorted) {
matchers->Sort();
sorted= TRUE;
}
Iter next(matchers);
TypeMatcher *m;
while (m= (TypeMatcher*) next())
if (m->MatchNameAndContents(name, buf, l))
return m;
return 0;
}
int TypeMatcher::Compare(Object *op)
{
return priority - ((TypeMatcher*)op)->priority;
}
//---- ETFileTypeMatcher -------------------------------------------------------
class ETFileTypeMatcher: public TypeMatcher {
public:
MetaDef(ETFileTypeMatcher);
ETFileTypeMatcher() : TypeMatcher(cDocTypeET, "et", "@!OIO", TRUE)
{ isETFormat= TRUE; }
bool MatchContents(char *buf, int);
};
NewMetaImpl0(ETFileTypeMatcher,TypeMatcher);
static ETFileTypeMatcher et_matcher;
bool ETFileTypeMatcher::MatchContents(char *buf, int l)
{
if (TypeMatcher::MatchContents(buf, l)) {
char ettype[100], crea[100];
if (sscanf(buf, "@!OIO %s %s", ettype, crea) == 2) {
type= Symbol(ettype);
creator= Symbol(crea);
return TRUE;
}
}
return FALSE;
}
//---- CFileTypeMatcher --------------------------------------------------------
class CFileTypeMatcher: public TypeMatcher {
public:
MetaDef(CFileTypeMatcher);
CFileTypeMatcher() : TypeMatcher(cDocTypeCPlusPlus, 0, 0, TRUE)
{ isCCode= TRUE; }
bool MatchExtension(char *ext);
bool MatchNameAndContents(char *path, char *buf, int len);
};
NewMetaImpl0(CFileTypeMatcher,TypeMatcher);
static CFileTypeMatcher cmatcher;
bool CFileTypeMatcher::MatchExtension(char *ext)
{
if (ext[1] == '\0' && strchr("cChH", ext[0]))
return TRUE;
if (strcmp(ext, "cp") == 0)
return TRUE;
if (strcmp(ext, "cxx") == 0)
return TRUE;
return FALSE;
}
bool CFileTypeMatcher::MatchNameAndContents(char *pathname, char*, int)
{
return MatchPathName(pathname, strlen(pathname));
}